textview: Fix placement of Emoji chooser
authorMatthias Clasen <mclasen@redhat.com>
Wed, 2 Sep 2020 12:04:15 +0000 (08:04 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 2 Sep 2020 19:20:58 +0000 (15:20 -0400)
If the selection extends beyond the visible range,
place the Emoji chooser over the center of the window.

Fixes: #3109
gtk/gtktextview.c

index 13938c4cb629845bb7539cb8228452a47ace7300..06caf5e3ee237bef85f58e37b50b089ebbd3a4f8 100644 (file)
@@ -9623,6 +9623,7 @@ gtk_text_view_insert_emoji (GtkTextView *text_view)
   GtkWidget *chooser;
   GtkTextIter iter;
   GdkRectangle rect;
+  GdkRectangle rect2;
   GtkTextBuffer *buffer;
 
   if (gtk_widget_get_ancestor (GTK_WIDGET (text_view), GTK_TYPE_EMOJI_CHOOSER) != NULL)
@@ -9639,6 +9640,7 @@ gtk_text_view_insert_emoji (GtkTextView *text_view)
     }
 
   buffer = get_buffer (text_view);
+
   gtk_text_buffer_get_iter_at_mark (buffer, &iter,
                                     gtk_text_buffer_get_insert (buffer));
 
@@ -9646,6 +9648,18 @@ gtk_text_view_insert_emoji (GtkTextView *text_view)
   gtk_text_view_buffer_to_window_coords (text_view, GTK_TEXT_WINDOW_TEXT,
                                          rect.x, rect.y, &rect.x, &rect.y);
   _text_window_to_widget_coords (text_view, &rect.x, &rect.y);
+  gtk_text_view_get_visible_rect (text_view, &rect2);
+  gtk_text_view_buffer_to_window_coords (text_view, GTK_TEXT_WINDOW_TEXT,
+                                         rect2.x, rect2.y, &rect2.x, &rect2.y);
+  _text_window_to_widget_coords (text_view, &rect2.x, &rect2.y);
+
+  if (!gdk_rectangle_intersect (&rect2, &rect, &rect))
+    {
+      rect.x = rect2.width / 2;
+      rect.y = rect2.height / 2;
+      rect.width = 0;
+      rect.height = 0;
+    }
 
   gtk_popover_set_pointing_to (GTK_POPOVER (chooser), &rect);